#ifndef TRACK_SETTINGS_H_
#define TRACK_SETTINGS_H_

#include <Eigen/Core>
#include <memory>

#include "common/fixed_array.h"

namespace autodrive {
namespace perception {
struct MapTrackParameter {
  float turn_score_threshold;
  float cross_score_threshold;
  float nostop_score_threshold;
  float DBSCAN_eps_turn;
  int DBSCAN_min_num_turn;
  float DBSCAN_eps_crosswalk;
  int DBSCAN_min_num_crosswalk;
  float DBSCAN_eps_nostop;
  int DBSCAN_min_num_nostop;
  float s_match_2DIOU_minimum;
  float s_match_distance_maximum;
  int collect_track_consecutive_invisible_maximum;
  int collect_track_age_minimum;
  float position_filter_alpha;
  float length_filter_alpha;
  float width_filter_alpha;
  float yaw_filter_alpha;
};

struct TrackedObject {
  ///@brief track id
  uint8_t id;
  ///@brief center
  Eigen::Vector3f center;
  ///@brief length
  float length;
  /// @brief width
  float width;
  /// @brief height
  float height;
  ///@brief yaw
  float yaw;
  ///@brief score
  float score;
  ///@brief association score , eg IOU score
  float association_score;
  /// @brief
  autodrive::perception::fixed_array<Eigen::Vector2f, 4> polygon;
  // points
  autodrive::perception::fixed_array<Eigen::Vector2f, 2048U> points;
};

using TrackedObjectPtr = std::shared_ptr<TrackedObject>;

struct Box {
  /// @brief Center
  Eigen::Vector3f center;
  /// @brief length
  float length;
  /// @brief width
  float width;
  /// @brief height
  float height;
  /// @brief polygon
  std::array<Eigen::Vector3f, 4> polygon;
};

enum class ProcessCategory {
  /// @brief unknown
  Unknown = 0,
  /// @brief unknown
  CrossWalk,
  /// @brief unknown
  Turn,
  /// @brief unknown
  No_Stop
};
}  // namespace perception
}  // namespace autodrive

#endif